Coder 灰桑

Stay Foolish, Always Foolish

Xcode 项目多环境配置

添加 Configuration

1⃣️前往 Project - info - Configurations

2⃣️点击 + Duplicate 相应的 Configuration

Configurations

添加 Scheme

1⃣️前往 Manage Scheme

2⃣️点击设置 Duplicate 相应的 Scheme

Duplicate Scheme

3⃣️修改相应的 Build Configuration 为上一步创建的 Configuration

Build Configuration 修改

配置 Bundle Id 生成不同的包

1⃣️前往 TARGETS - Build Settings

2⃣️修改 Product Bundle Identifier 中 Configuration 相应的 Bundle Id

Bundle Id

配置应用名称

1⃣️前往 TARGETS - Build Settings

2⃣️顶部菜单 Editor - Add Build Setting 添加 User-Defined Setting

User-Defined Setting

3⃣️设置相应 Configuration 的应用名

应用名设置

4⃣️在 info.plist 中配置 Bundle display name 为上一步设置的参数

Bundle display name

在代码中根据 Configuration 配置相关数据

1⃣️在 info.plist 中添加一个值: key:Configuration Value:$(CONFIGURATION)

$Configuration

2⃣️实现一个方法获取

class BuildConfiguration {
    static let shared = BuildConfiguration()
    var environment: Environment
    
    var baseURL: String { // 1
        switch environment {
        case .debugStaging, .releaseStaging:
            return "https://staging.example.com/api"
        case .debugDevelopment, .releaseDevelopment:
            return "https://dev.example.com/api"
        case .debugProduction, .releaseProduction:
            return "https://example.com/api"
        }
    }
    
    init() {
        let currentConfiguration = Bundle.main.object(forInfoDictionaryKey: "Configuration") as! String
        
        environment = Environment(rawValue: currentConfiguration)!
    }
}

BuildConfiguration.shared.baseURL

xcconfig 概念及其作用

一般修改 Build Setting 的办法是在 Xcode 的 Build Settings 界面上进行。手工修改容易出错,且不便于查找。 Xcode 提供了 Build configuration file(构建配置文件)来为 Project 或 Target 定义一组 Build Setting。也就是 xcconfig 的作用。使用 xcconfig 因为是纯文本所有非常容易查看修改了哪些配置不容易出错。

xcconfig 优先级

使用 xcconfig 时,Xcode 构建系统会按照下面的优先级来计算出 Build Setting 的最后生效值:

  • Platform Defaults (平台默认值)
  • Xcode Project xcconfig File(Project 级别的 xcconfig 文件)
  • Xcode Project File Build Settings(Project 级别的手工配置的 Build Setting)
  • Target xcconfig File (Target 级别的 xcconfig 文件)
  • Target Build Settings(Target 级别的手工配置的 Build Setting)

Xcode 构建系统会按照上述列表从上而下读取 Build Setting,如果发现同样的 Setting ,就会把下面的 Setting 覆盖掉上面的,越往下优先级别越高。

格式和写法

/// 通过#include引入其他 xcconfig 文件
#include "path/to/OtherFile.xcconfig"

/// xcconfig 中配置的格式 key = value
BUILD_SETTING_NAME = value

/// 通过使用 $(inherited) 来保留原先的值 
BUILD_SETTING_NAME = $(inherited) additional value

/// 引用其他已定义的 Build Setting
FRAMEWORK_SEARCH_PATHS = $(inherited) $(PROJECT_DIR)

xcconfig 分类

可以把 xcconfig 文件分成三大类:Shared、 Project 和 Targets。

  • Shared: 文件夹用于保存分享到整个 App 的 Build Setting,例如 Swift 的版本号、App 所支持的 iOS 版本号等各种共享的基础信息。
  • Project: 文件夹用于保存 Xcode Project 级别的 Build Setting,其中 BaseProject.xcconfig 会引入 Shared 文件夹下所有的 xcconfig 配置文件。
  • Targets: 文件夹用于保存 Xcode Target 级别的 Build Setting,也是由一个 BaseTarget.xcconfig 文件来共享所有 Target 都需要使用的信息。它们都需要引入 CocoaPods 所生成的 xcconfig 和共享的 BaseTarget.xcconfig 文件,然后根据需要改写 App 的名字。

xcoconfig 配置

配置图例子

参考: 配置准备:如何搭建多环境支持,为 App 开发作准备

🔙  揭开 SwiftUI 神秘面纱
SwiftUI 如何监听 @State 变更  🔜